package org.smart4j.framework.bean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.smart4j.framework.util.CastUtil;
import org.smart4j.framework.util.CollectionUtil;
import org.smart4j.framework.util.StringUtil;

/**
 * description: 请求参数对象 Param
 * @version v1.0
 * @author w
 * @date 2018年9月1日上午10:29:59
 */
public class Param {
	
	/**
	 * 表单参数 list
	 */
	private List<FormParam> formParamList ;
	
	/**
	 * 文件上传参数 list
	 */
	private List<FileParam> fileParamList ;
	
	public Param(List<FormParam> formParamList) {
		this.formParamList = formParamList;
	}
	
	public Param(List<FormParam> formParamList, List<FileParam> fileParamList) {
		this.formParamList = formParamList;
		this.fileParamList = fileParamList;
	}


	private Map<String,Object> paramMap ;

	public Param(Map<String, Object> paramMap) {
		super();
		this.paramMap = paramMap;
	}
	
	/**
	 * description: 获取 请求参数  map 映射 
	 * @return Map<String,Object>
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午9:57:27
	 */
	public Map<String,Object> getFieldMap(){
		Map<String,Object> fieldMap = new HashMap<String, Object>();
		if(CollectionUtil.isNotEmpty(formParamList)){
			for (FormParam formParam : formParamList) {
				String fieldName = formParam.getFieldName();
				Object fieldValue = formParam.getFieldValue();
				if(fieldMap.containsKey(fieldName)){
					// 若 fieldName 存在，则进行字符串拼接
					fieldValue=fieldMap.get(fieldName)+StringUtil.SEPARATOR+fieldValue;
				}
				fieldMap.put(fieldName, fieldValue);
			}
		}
		return fieldMap;
	}
	
	
	public Map<String,List<FileParam>> getFileMap(){
		Map<String,List<FileParam>> fieldMap = new HashMap<String, List<FileParam>>();
		for (FileParam fileParam : fileParamList) {
			String fieldName = fileParam.getFieldName();
			List<FileParam> fileParamList ;
			if(fieldMap.containsKey(fieldName)){
				fileParamList = fieldMap.get(fieldName);
			}else{
				fileParamList = new ArrayList<FileParam>();
			}
			fileParamList.add(fileParam);
			fieldMap.put(fieldName, fileParamList);
		}
		return fieldMap;
	}
	
	
	/**
	 * description: 获取所有上传文件 
	 * @param fieldName
	 * @return List<FileParam>
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午10:26:43
	 */
	public List<FileParam> getFileList(String fieldName){
		return getFileMap().get(fieldName);
	}
	
	/**
	 * description: 获取唯一上传文件
	 * @param fieldName
	 * @return FileParam
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午10:30:33
	 */
	public FileParam getFile(String fieldName){
		List<FileParam> fileList = getFileList(fieldName);
		if(CollectionUtil.isNotEmpty(fileList) && fileList.size() == 1){
			return  fileList.get(0);
		}
		return null;
	}
	
	/**
	 * description: 获取 int 类型的参数值
	 * @param name
	 * @return int
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午10:40:19
	 */
	public int getInt(String name){
		return CastUtil.castInt(getFieldMap().get(name));
	}
	
	/**
	 * description: 获取long类型的参数值
	 * @param name
	 * @return long
	 * @version v1.0
	 * @author w
	 * @date 2018年9月1日 上午10:33:04
	 */
	public long getLong (String name){
		return Long.parseLong(paramMap.get(name).toString());
	}
	
	public double getDouble(String name){
		return CastUtil.castDouble(getFieldMap().get(name));
	}
	
	/**
	 * description: 获取 boolean 类型的参数值
	 * @param name
	 * @return boolean
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午10:41:40
	 */
	public boolean getBoolean(String name){
		return CastUtil.castBoolean(getFileMap().get(name));
	}
	
	/**
	 * description: 获取所有的字段名和字段值 映射  paramMap
	 * @return Map<String,Object>
	 * @version v1.0
	 * @author w
	 * @date 2018年9月1日 上午10:33:36
	 */
	public Map<String, Object> getParamMap() {
		return paramMap;
	}
	
	/**
	 * description: 验证参数是否为空
	 * @return
	 * @return boolean
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午12:51:58
	 */
	public boolean isEmpty(){
		return CollectionUtil.isEmpty(formParamList) && CollectionUtil.isEmpty(fileParamList);
	}
	
}	
